﻿// 1396. 街头竞速.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>


/*

https://www.acwing.com/problem/content/description/1398/

下图给出了一个街头竞速的跑道示例。

race.gif

你可以看到一些点，标记为 0∼N，一些箭头将它们连接了起来。

点 0 处是比赛的起点，点 N 处是比赛的终点。

在上图中，N=9。

箭头代表单向街道。

比赛的参与者仅可沿着箭头的方向在街道上从点到点进行移动。

在每一个点上，参与者都可以沿着任意一个由该点发出的箭头的方向走向邻近的点。

一个合规的比赛跑道应该具备以下特点：

从起点出发可以到达跑道中的所有点。
从任意一个点出发都可以到达跑道的终点。
不存在任何由终点发出的箭头。
参与者从起点到达终点的过程中，可以不经过所有的点。

但是，有一些点却是不得不经过的，我们称之为必经点。

在示例中，点 0,3,6,9 就是必经点。

现在，给定一个合规的跑道，请你找出除了起点和终点以外的所有必经点。

假设，比赛要分两天进行。

因此，需要将跑道分为两个分赛道，每天参与者需要跑完一个分赛道。

第一天起点在 0 点，终点在某个中间点（称之为分割点）。

第二天起点在分割点，终点在 N 点。

你还需要确定跑道中的所有可能的分割点。

一个点 S 能够成为跑道的分割点，需满足：

该点不是跑道的起点或终点。
跑道可以被该点分割成两个部分，且两部分都是合规的。
被分割的两个部分不存在公共箭头，点 S 是两部分唯一的公共点，在其中一部分作为终点，另一部分作为起点。
在示例中，只有点 3 是分割点。

输入格式
输入包括一个合规赛道的信息，该赛道最多包含 50 个点，100 个箭头。

输入共有 N+2 行。

前 N+1 行，第 i 行包含了从点 i−1 发出的箭头能到达的所有点，这些点全部描述完毕后，包含一个 −2 作为行结尾。

最后一行，只包含一个整数 −1，表示输入结束。

输出格式
输出共两行。

第一行，首先输出一个整数，表示必经点的数量，然后按升序输出所有必经点的编号（不包括起点和终点）。

第二行，首先输出一个整数，表示分割点的数量，然后按升序输出所有分割点的编号。

输入样例：
1 2 -2
3 -2
3 -2
5 4 -2
6 4 -2
6 -2
7 8 -2
9 -2
5 9 -2
-2
-1
输出样例：
2 3 6
1 3
*/
int main()
{
    std::cout << "Hello World!\n";
}

